Processing systems conventionally implement memory management functionality to translate addresses from a virtual address space used by each process and/or I/O device to a physical address that may span the actual system memory. This memory management functionality may include various memory protections (e.g., read only, read/write privileges, etc.) and may restrict access to certain pages of memory to particular processes or I/O devices. The use of these memory management techniques may help protect the main memory as well as improve system performance.
One issue with these memory management techniques is that translation requests received over an I/O bus that are not able to be serviced (i.e., missed requests) may cause requests for a particular I/O device to be serviced out-of-order. Another issue with these memory management techniques is that translation requests that are not able to be serviced may cause requests for other I/O devices to be delayed or blocked. Yet another issue with these memory management techniques is that during virtual machine migration, it may be difficult to track memory pages that were accessed by an I/O device between the initial and final copy phases.